/**
 * 文件名：@AfwDispatchServlet.java <br/>
 * 包名：cn.efunbox.afw.web.mvc.springmvc <br/>
 * 项目名：afw-mvc-web <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.web.mvc.springmvc;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.View;

import cn.efunbox.afw.core.AfwContext;
import cn.efunbox.afw.core.annotation.mvc.Result;
import cn.efunbox.afw.core.mvc.HandlerInfo;
import cn.efunbox.afw.core.mvc.context.Context;
import cn.efunbox.afw.core.mvc.template.Templator;
import cn.efunbox.afw.core.resolver.HandlerInfoResolver;
import cn.efunbox.afw.web.util.AfwWebConstant;

/**
 * 类名：AfwDispatchServlet  <br />
 *
 * 功能：调度器
 *
 * @author xtwin <br />
 * 创建时间：2015年12月2日 下午6:32:48  <br />
 * @version 2015年12月2日
 */
public class AfwDispatchServlet extends DispatcherServlet {

	/** add by xtwin 2015年12月2日 下午6:33:16 */
	private static final long serialVersionUID = 4548506568021152817L;
	
	// 日志记录器
	private static final Log logger = LogFactory.getLog(AfwDispatchServlet.class);

	// 上下文解析器
	//private ContextResolver contextResolver;
	
	// 上下文解析器的bean名称
	//private String contextResolverName = "contextResolver";
	
	// handlerInfo解析器
	private HandlerInfoResolver handlerInfoResolver;
	
	// handlerInfoResolver配置时，使用的名称
	public static final String HANDLER_INFO_RESOLVER_BEAN_NAME = "HandlerInfoResolver";
	
	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2015年12月2日 下午6:35:01<br/>
	 * 
	 * @param context <br/>
	 * @see org.springframework.web.servlet.DispatcherServlet#onRefresh(org.springframework.context.ApplicationContext)
	 */
	@Override
	protected void onRefresh(ApplicationContext context) {
		super.onRefresh(context);
		
		logger.info("application context is refreshed.");
		
		// 取出上线文解析器
		//contextResolver = context.getBean(contextResolverName, ContextResolver.class);
		
		// 取出HandlerInfo对象解析器
		handlerInfoResolver = context.getBean(HANDLER_INFO_RESOLVER_BEAN_NAME, HandlerInfoResolver.class);
		
		// 保存spring上下文
		AfwContext.setApplicationContext(context);
	}
	
	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2015年12月3日 下午4:22:34<br/>
	 * 
	 * @param mv
	 * @param request
	 * @param response
	 * @throws Exception <br/>
	 * @see org.springframework.web.servlet.DispatcherServlet#render(org.springframework.web.servlet.ModelAndView, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
	 */
	@Override
	protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		// 取得上下文
		Context context = AfwContext.getContext();
		
		int resultCode = context.getResult();
		
		/**
		 *  这里的view，可以是字符串或者org.springframework.web.servlet.View两种类型
		 *  当是字符串时，可以包含冒号分割的两部分内容（若省略冒号，则认为全是resource，而view取默认值）
		 *  	view:resource
		 */
		// TODO 待实现取系统配置的默认值，这里先默认为Json
		Object vr = "Json:";
		
		// 取出当前的handler
		HandlerInfo info = handlerInfoResolver.resolve(AfwContext.getValue(AfwWebConstant.KEY_HANDLER_IN_AFWCONTEXT));
		if (null != info) {
			Result result = info.getResult();
			if (null != result) {
				// 取出对应的视图配置
				vr = result.value()[resultCode];
			} else {
				// 取当前模板中的配置
				Templator templator = info.getTemplator();
				
				List<?> results = templator.getResult();
				
				if (null != results && results.size() > 0) {
					vr = results.get(resultCode);
				} else {
					vr = "Json:";
				}
			}
		}
		
		if (vr instanceof String) {
			String _viewResource = (String) vr;
			// 采用冒号（:）分割的视图配置，前面是视图名称，后面是视图资源
			int index = _viewResource.indexOf(':');
			
			String resource = null;
			String view = null;
			if (index != -1) {
				// 视图
				view = _viewResource.substring(0, index);
				
				// 资源
				resource = _viewResource.substring(index + 1);
			} else {
				if (null != info) {
					// 使用默认视图名称
					view = info.getResultType();
				}
				
				resource = _viewResource;
			}
			
			// 保存视图资源
			//request.setAttribute(AfwWebConstant.KEY_RESULT_RESOURCE, ((String) vr).substring(index + 1));
			request.setAttribute(AfwWebConstant.KEY_RESULT_RESOURCE, resource);
			
			mv.setViewName(view);
		} else {
			mv.setView((View) vr);
		}
		
		if (null != context) {
			// 放入模型数据数据
			mv.addAllObjects(context.getValue());
		}
		
		super.render(mv, request, response);
	}
//	@Override
//	protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception {
//		
//		// 取出当前的handler
//		Object handler = AfwContext.getValue(AfwWebConstant.KEY_HANDLER_IN_AFWCONTEXT);
//		if (handler instanceof AfwHandlerMethod) {
//			
//			// 取得上下文
//			Context context = AfwContext.getContext();
//			
//			int resultCode = context.getResult();
//			
//			/**
//			 *  这里的view，可以是字符串或者org.springframework.web.servlet.View两种类型
//			 *  当是字符串时，可以包含冒号分割的两部分内容（若省略冒号，则认为全是resource，而view取默认值）
//			 *  	view:resource
//			 */
//			Object vr = null;
//			
//			Result result = ((HandlerMethod) handler).getMethod().getAnnotation(Result.class);
//			if (null != result) {
//				// 取出对应的视图配置
//				vr = result.value()[resultCode];
//			} else {
//				// 取当前模板中的配置
//				Templator templator = ((AfwHandlerMethod) handler).getTemplator();
//				
//				List<?> results = templator.getResult();
//				
//				if (null != results && results.size() > 0) {
//					vr = results.get(resultCode);
//				} else {
//					// TODO 待实现取系统配置的默认值，这里先默认为Json
//					vr = "Json:";
//				}
//			}
//			
//			if (vr instanceof String) {
//				String _viewResource = (String) vr;
//				// 采用冒号（:）分割的视图配置，前面是视图名称，后面是视图资源
//				int index = _viewResource.indexOf(':');
//				
//				String resource = null;
//				String view = null;
//				if (index != -1) {
//					// 视图
//					view = _viewResource.substring(0, index);
//					
//					// 资源
//					resource = _viewResource.substring(index + 1);
//				} else {
//					// 使用默认视图名称
//					view = ((AfwHandlerMethod) handler).getResultType();
//					
//					resource = _viewResource;
//				}
//				
//				// 保存视图资源
//				//request.setAttribute(AfwWebConstant.KEY_RESULT_RESOURCE, ((String) vr).substring(index + 1));
//				request.setAttribute(AfwWebConstant.KEY_RESULT_RESOURCE, resource);
//				
//				mv.setViewName(view);
//			} else {
//				mv.setView((View) vr);
//			}
//			
//			// 放入模型数据数据
//			mv.addAllObjects(context.getValue());
//		}
//		
//		super.render(mv, request, response);
//	}
	
	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2015年12月2日 下午6:39:55<br/>
	 * 
	 * @param request
	 * @param response
	 * @throws Exception <br/>
	 * @see org.springframework.web.servlet.DispatcherServlet#doDispatch(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
	 */
	/*@Override
	protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
		// 保存当前的context对象
		AfwContext.setContext(contextResolver.resolve());
		
		super.doDispatch(request, response);
	}*/
	
	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2015年12月2日 下午6:40:02<br/>
	 * 
	 * @param request
	 * @return
	 * @throws MultipartException <br/>
	 * @see org.springframework.web.servlet.DispatcherServlet#checkMultipart(javax.servlet.http.HttpServletRequest)
	 */
	/*@Override
	protected HttpServletRequest checkMultipart(HttpServletRequest request) throws MultipartException {
		return super.checkMultipart(request);
	}*/
}